package com.example.client;

import com.example.annotation.Component;

import java.awt.*;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * ClassName:ReflectAnnotationTest2
 * Package:com.example.client
 * Description:
 *
 * @Author:ZhangXin
 * @Create:2023/5/9-20:38
 * @Version:v1.0
 */
public class ComponentScan {
    public static void main(String[] args) {

        Map<String ,Object> beanMap = new HashMap<>();

        //目前只知道一个包的名字,扫描这个包下所有的类,实例化对象,当这个类上有@Component注解的时候,实例化该对象,然后放到Map集合中
        String packageName = "com.example.bean";
        //开始写扫描程序
        // . 这个正则表达式代表任意字符,这里的 . 必须是一个普通字符,不能是正则表达式中的
        String packagePath = packageName.replaceAll("\\.", "/");//替换
        System.out.println(packagePath);
        //com 是在类的根路径下的一个目录
        URL url = ClassLoader.getSystemClassLoader().getResource(packagePath);
        String path = url.getPath();
        System.out.println(path);
        //获取绝对路径下的所有文件
        File file = new File(path);
        File[] files = file.listFiles();
        Arrays.stream(files).forEach(f->{
//            System.out.println(f.getName());
//            System.out.println(f.getName().split("\\.")[0]);
            String className = packageName+"."+f.getName().split("\\.")[0];
//            System.out.println(className);
            //通过反射机制解析注解
            try {
                Class<?> aClass = Class.forName(className);
                if (aClass.isAnnotationPresent(Component.class)){
                    //获取注解
                    Component annotation = aClass.getAnnotation(Component.class);
                    String id = annotation.value();
                    //有着注解的都要创建对象
                    Object obj = aClass.newInstance();
                    beanMap.put(id,obj);

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        System.out.println(beanMap);
    }
}
